unit PSshader;

interface

implementation
uses

  Windows, Messages, SysUtils, Classes,
  Graphics, Controls, Forms, Dialogs,
  OpenGL, dglOpenGL;

type
  pointeurChar = ^char;

function LoadSource(const filename : pointeurChar): pointeurChar ;
var
    src : pointeurChar;
    fp : ^file;
    size : long;
    i : long;
    buttonSelected:integer;
begin
    src := nil;
    fp := Nil;

    AssignFile(fp^, filename^);
    Reset(fp^, 1);
    try
        Size := FileSize(fp^);
        GetMem(src, Size+1);
        try
            BlockRead(fp^, src^, Size);
            //src[size+1]^ = '\0';
            result:=src
        finally
          FreeMem(src);
        end;
    finally
        CloseFile(fp^);
    end;

end;
 {
function LoadShader(myType : GLenum; const filename : pointeurChar ): GLuint;
var
     shader : GLuint;
     logsize:GLsizei;
     compile_status : GLint;
     log : pointeurChar;
     src : pointeurChar;
begin
    shader := 0;
    logsize := 0;
    compile_status := GL_TRUE;
    log := Nil;
    src := nil;

    // creation d'un shader de sommet
    shader := glCreateShader(myType);
    if (shader = 0) then
    begin
        ShowMessage('impossible de creer le shader');
        result := 0;
    end;

    // chargement du code source */
    src := LoadSource(filename);
    if(src = nil)then
    BEGIN
        // theoriquement, la fonction LoadSource a deja affiche un message
        //   d'erreur, nous nous contenterons de supprimer notre shader
        //   et de retourner 0 */

        glDeleteShader(shader);
        result := 0;
    END;

    // assignation du code source */
    glShaderSource(shader, 1, (const GLchar^^)&src, nil);

    // compilation du shader */
    glCompileShader(shader);

    // liberation de la memoire du code source */
    free(src);
    src := nil;

    // verification du succes de la compilation */
    glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status);
    if  compile_status <> GL_TRUE  then
    BEGIN
        // erreur a la compilation recuperation du log d'erreur */

        // on recupere la taille du message d'erreur */
        glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logsize);

        // on alloue un espace memoire dans lequel OpenGL ecrira le message */
        log = malloc(logsize + 1);
        if (log = nil) then
        BEGIN
            fprintf(stderr, "impossible d'allouer de la memoire !\n");
            return 0;
        END;
        // initialisation du contenu */
        memset(log, '\0', logsize + 1);

        glGetShaderInfoLog(shader, logsize, &logsize, log);
        fprintf(stderr, "impossible de compiler le shader '%s' :\n%s",
                filename, log);

        // ne pas oublier de liberer la memoire et notre shader */
        free(log);
        glDeleteShader(shader);

        result := 0;
    END;

    result := shader;
end;
   }
end.
